<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="Content-Language" content="zh-CN"><title>pam_systemd
  中文手册 [金步国]</title><style>
@font-face { font-family: "JinBuGuoWebMono"; src: url("http://www.jinbuguo.com/d/mono.ttf") format("truetype"); }
* { font-family: "JinBuGuoWebMono", "Ubuntu Mono", "Consolas", "Menlo", monospace; }
body { margin:10px; }
h1 { text-align:center; background:#ddd; }
h2#auth_name { text-align:center; margin: 10px 5%; }

    a.headerlink {
      color: #c60f0f;
      font-size: 0.8em;
      padding: 0 4px 0 4px;
      text-decoration: none;
      visibility: hidden;
    }

    a.headerlink:hover {
      background-color: #c60f0f;
      color: white;
    }

    h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, dt:hover > a.headerlink {
      visibility: visible;
    }
</style><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><h1>pam_systemd 中文手册</h1><h2 id="auth_name">译者：<strong><a href="http://www.jinbuguo.com/">金步国</a></strong></h2><hr><h3>版权声明</h3><p>本文译者是一位开源理念的坚定支持者，所以本文虽然不是软件，但是遵照开源的精神发布。</p><ul><li>无担保：本文译者不保证译文内容准确无误，亦不承担任何由于使用此文档所导致的损失。</li><li>自由使用：任何人都可以自由的<u>阅读/链接/打印</u>此文档，无需任何附加条件。</li><li>名誉权：任何人都可以自由的<u>转载/引用/再创作</u>此文档，但必须保留译者署名并注明出处。</li></ul><h3>其他作品</h3><p>本文译者十分愿意与他人分享劳动成果，如果你对我的其他翻译作品或者技术文章有兴趣，可以在如下位置查看现有的作品集：</p><ul><li><a href="http://www.jinbuguo.com/">金步国作品集</a> [ <a href="http://www.jinbuguo.com/">http://www.jinbuguo.com/</a> ]</li></ul><h3>联系方式</h3><p>由于译者水平有限，因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好)，请来信指出，任何提高译文质量的建议我都将虚心接纳。</p><ul><li>Email(QQ)：70171448在QQ邮箱</li></ul><hr><a href="systemd.index.html">手册索引</a> ·
  <a href="systemd.directives.html">指令索引</a><span style="float:right">systemd-241</span><hr><div class="refentry"><a name="pam_systemd"></a><div class="titlepage"></div><div class="refnamediv"><h2>名称</h2><p>pam_systemd — 在 systemd 登录管理器中注册用户会话</p></div><div class="refsynopsisdiv"><h2>大纲</h2><p><code class="filename">pam_systemd.so</code></p></div><div class="refsect1"><a name="id-1.5"></a><h2 id="描述">描述<a class="headerlink" title="Permalink to this headline" href="pam_systemd.html#%E6%8F%8F%E8%BF%B0">¶</a></h2><p><span class="command"><strong>pam_systemd</strong></span>
    将用户会话注册到 systemd 登录管理器(也就是
    <a href="systemd-logind.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-logind.service</span>(8)</span></a> 服务)中，
    因此也同时注册到了 systemd 控制组(control group)之中。</p><p>在登录(login)时，此模块与 <code class="filename">systemd-logind.service</code> 服务一起，
    确保实现如下功能：</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>如果用户运行时目录(<code class="filename">/run/user/$UID</code>)不存在，
      那么就创建该目录或者以"<code class="literal">tmpfs</code>"文件系统挂载该目录，
      同时根据登录用户为该目录设置磁盘配额、属主与属组。</p></li><li class="listitem"><p>设置 <code class="varname">$XDG_SESSION_ID</code> 环境变量的值。
      如果开启了审计并且 <span class="command"><strong>pam_loginuid.so</strong></span> 运行在此模块之前(强烈建议这么做)，
      那么将使用审计会话ID(<code class="filename">/proc/self/sessionid</code>)的值，
      否则将使用独立的会话计数器的值。</p></li><li class="listitem"><p>为会话创建一个新的 scope 单元。如果此会话是该用户多个并行会话中第一个建立的会话，
      那么将会在 <code class="filename">user.slice</code> 之下自动创建一个针对该用户的 slice 单元，并将新建的 scope 单元置于其中。
      按照会话用户的身份启动一个 <code class="filename">user@.service</code> 系统服务实例
      (也就是运行一个 systemd 用户实例)。</p></li></ol></div><p>在退出(logout)时，此模块确保实现如下功能：</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>如果在
      <a href="logind.conf.html#"><span class="citerefentry"><span class="refentrytitle">logind.conf</span>(5)</span></a> 中设置了 <code class="varname">KillUserProcesses=yes</code> (无论明确还是隐含)，
      那么将会杀死会话中的所有进程。如果此会话是该用户多个并行会话中最后一个退出的会话，
      那么还会同时终止该用户的 systemd 用户实例以及 slice 单元。</p></li><li class="listitem"><p>如果此会话是该用户多个并行会话中最后一个退出的会话，
      那么将会删除该用户的运行时目录(<code class="filename">/run/user/$UID</code>)
      以及其中的所有内容。</p></li></ol></div><p>如果系统的 init 进程不是 systemd ，
    那么此模块什么也不做，并且立即返回
    <code class="constant">PAM_SUCCESS</code> 值。</p></div><div class="refsect1"><a name="id-1.6"></a><h2 id="选项">选项<a class="headerlink" title="Permalink to this headline" href="pam_systemd.html#%E9%80%89%E9%A1%B9">¶</a></h2><p>可以使用的选项如下：</p><div class="variablelist"><dl class="variablelist"><dt id="class="><span class="term"><code class="varname">class=</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#class=">¶</a></dt><dd><p>设置会话类。环境变量 <code class="varname">XDG_SESSION_CLASS</code> 的值会覆盖此设置(参见"环境变量"小节)。
        可设为 "<code class="literal">user</code>", "<code class="literal">greeter</code>",
        "<code class="literal">lock-screen</code>", "<code class="literal">background</code>" 之一。详见
        <a href="http://www.jinbuguo.com/systemd/sd_session_get_class.html#"><span class="citerefentry"><span class="refentrytitle">sd_session_get_class</span>(3)</span></a>
        手册。</p></dd><dt id="type="><span class="term"><code class="varname">type=</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#type=">¶</a></dt><dd><p>设置会话类型。环境变量 <code class="varname">XDG_SESSION_TYPE</code> 的值会覆盖此设置(参见"环境变量"小节)。
        可设为 "<code class="literal">unspecified</code>",
        "<code class="literal">tty</code>", "<code class="literal">x11</code>", "<code class="literal">wayland</code>", "<code class="literal">mir</code>" 之一。详见
        <a href="http://www.jinbuguo.com/systemd/sd_session_get_type.html#"><span class="citerefentry"><span class="refentrytitle">sd_session_get_type</span>(3)</span></a>
        手册。</p></dd><dt id="desktop="><span class="term"><code class="varname">desktop=</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#desktop=">¶</a></dt><dd><p>设置会话桌面环境(若存在)。
        例如 "<code class="literal">GNOME</code>" 或 "<code class="literal">KDE</code>" 。
        环境变量 <code class="varname">XDG_SESSION_DESKTOP</code>
        的值会覆盖此设置(参见"环境变量"小节)。
        建议使用与 <code class="varname">$XDG_CURRENT_DESKTOP</code> 环境变量(参见 <a class="ulink" href="https://standards.freedesktop.org/desktop-entry-spec/latest/" target="_top">Desktop Entry
        Specification</a> 规范)完全相同的标识符。注意，此选项只接收一个单独值，
        而不像 <code class="varname">$XDG_CURRENT_DESKTOP</code> 那样接受以冒号分隔的列表。详见
        <a href="http://www.jinbuguo.com/systemd/sd_session_get_desktop.html#"><span class="citerefentry"><span class="refentrytitle">sd_session_get_desktop</span>(3)</span></a>
        手册。</p></dd><dt id="debug="><span class="term"><code class="varname">debug</code>[<span class="optional">=</span>]</span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#debug=">¶</a></dt><dd><p>接受一个可选的布尔值。
        不带参数(等价于设为"yes")表示在日志中记录详细的调试信息。</p></dd></dl></div></div><div class="refsect1"><a name="id-1.7"></a><h2 id="提供的模块类型">提供的模块类型<a class="headerlink" title="Permalink to this headline" href="pam_systemd.html#%E6%8F%90%E4%BE%9B%E7%9A%84%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%9E%8B">¶</a></h2><p>仅提供 <code class="option">session</code> 类型。</p></div><div class="refsect1"><a name="id-1.8"></a><h2 id="环境变量">环境变量<a class="headerlink" title="Permalink to this headline" href="pam_systemd.html#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F">¶</a></h2><p>此模块将会为用户会话中的进程
    初始化如下环境变量：</p><div class="variablelist"><dl class="variablelist"><dt id="$XDG_SESSION_ID"><span class="term"><code class="varname">$XDG_SESSION_ID</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#%24XDG_SESSION_ID">¶</a></dt><dd><p>"会话ID"，可用于各种文件名。
        虽然它通常就是审计会话ID的值(<code class="filename">/proc/self/sessionid</code>)，
        但是其值本身并没有什么特别的含义。
        因为在整个系统运行期间，每个 ID 仅会被分配一次，
        所以可以将其视为本次会话的可靠标签，用于标记文件或其他资源。
        将"会话ID"与启动标识符(<a href="http://www.jinbuguo.com/systemd/sd_id128_get_boot.html#"><span class="citerefentry"><span class="refentrytitle">sd_id128_get_boot</span>(3)</span></a>)组合在一起，
        即可在全局范围内唯一标识当前会话。</p></dd><dt id="$XDG_RUNTIME_DIR"><span class="term"><code class="varname">$XDG_RUNTIME_DIR</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#%24XDG_RUNTIME_DIR">¶</a></dt><dd><p>在登录期间该用户专属的可读写目录(用户运行时目录)的路径。
        该目录将在用户首次登录时创建、
        并在用户退出最后一个会话时删除。
        对于同一个用户的多个同时存在的不同会话来说，
        这些会话中的所有进程看到的
        <code class="varname">$XDG_RUNTIME_DIR</code> 目录中的内容都完全相同。
        注意，如果某个用户退出了全部会话，那么该目录中的内容将会彻底丢失，
        即使之后再次重新登录，该目录中原有的内容也依然无法恢复。
        应用程序不应该依赖于此目录的自动销毁特性，
        而应该自己处理过期文件(例如及时删除无用的文件)。
        如果想要在此目录中保存某个会话专属的私有数据，那么应该在文件名中包含
        <code class="varname">$XDG_SESSION_ID</code> 的值。
        此目录一般仅用于存放运行时文件系统对象，
        例如 <code class="constant">AF_UNIX</code> 套接字、管道(FIFO)、PID 文件……之类。
        必须确保此目录位于本机系统中，
        并且能够完整提供所有可能的文件系统特性。
        详见 <a class="ulink" href="https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html" target="_top">XDG
        Base Directory Specification</a> 文档。如果当前用户不是该会话的登录用户，
        那么 <code class="varname">$XDG_RUNTIME_DIR</code> 变量将不会被设置。</p></dd></dl></div><p>pam_systemd 模块将会读取下面的环境变量，
    因此， PAM 服务可以使用下列环境变量向 pam_systemd 模块传递配置数据。
    如果在调用PAM模块时尚未设置这些变量，但可以推断出这些变量的值，那么 pam_systemd 模块将会设置它们。
    因此，只要能够推断出这些变量的值，就会为会话和应用程序初始化这些变量。</p><div class="variablelist"><dl class="variablelist"><dt id="$XDG_SESSION_TYPE"><span class="term"><code class="varname">$XDG_SESSION_TYPE</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#%24XDG_SESSION_TYPE">¶</a></dt><dd><p>会话类型。推荐使用此变量来代替
         <code class="varname">session=</code> 模块选项。</p></dd><dt id="$XDG_SESSION_CLASS"><span class="term"><code class="varname">$XDG_SESSION_CLASS</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#%24XDG_SESSION_CLASS">¶</a></dt><dd><p>会话类。推荐使用此变量来代替
         <code class="varname">class=</code> 模块选项。</p></dd><dt id="$XDG_SESSION_DESKTOP"><span class="term"><code class="varname">$XDG_SESSION_DESKTOP</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#%24XDG_SESSION_DESKTOP">¶</a></dt><dd><p>会话桌面环境。推荐使用此变量来代替
         <code class="varname">desktop=</code> 模块选项。</p></dd><dt id="$XDG_SEAT"><span class="term"><code class="varname">$XDG_SEAT</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#%24XDG_SEAT">¶</a></dt><dd><p>用于注册会话的
        席位名称(如果存在的话)。</p></dd><dt id="$XDG_VTNR"><span class="term"><code class="varname">$XDG_VTNR</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#%24XDG_VTNR">¶</a></dt><dd><p>用于注册会话的虚拟终端编号(如果存在的话)。
        仅用于拥有虚拟终端的席位(例如
         "<code class="literal">seat0</code>")。</p></dd></dl></div><p>若尚未设置， <span class="command"><strong>pam_systemd</strong></span>
     将会根据 <code class="varname">$DISPLAY</code> 的值(若存在)初始化
    <code class="varname">$XDG_SEAT</code> 与 <code class="varname">$XDG_VTNR</code></p></div><div class="refsect1"><a name="id-1.9"></a><h2 id="会话限制">会话限制<a class="headerlink" title="Permalink to this headline" href="pam_systemd.html#%E4%BC%9A%E8%AF%9D%E9%99%90%E5%88%B6">¶</a></h2><p>在 PAM 栈中位于 <span class="command"><strong>pam_systemd.so</strong></span>
    之前的模块，能够使用 PAM 上下文对象设置会话 scope 限制。
    这些对象的数据以NULL结尾的C风格字符串提供，并直接映射到对应单元的资源控制指令。
    注意，这些限制作用于用户的每一个会话，而不是用户的全部进程(可能分属不同的会话)的整体。
    特别地，运行每个用户的 <span class="command"><strong>systemd --user</strong></span> 管理进程及其子进程、并且在任何会话之外跟踪、被所有用户会话共享的
     <span class="command"><strong>user@.service</strong></span> 服务实例，是不在限制范围之内的。
    </p><p> 详见
    <a href="systemd.resource-control.html#"><span class="citerefentry"><span class="refentrytitle">systemd.resource-control</span>(5)</span></a> 以了解资源控制。
    详见 <a href="http://www.jinbuguo.com/systemd/pam_set_data.html#"><span class="citerefentry"><span class="refentrytitle">pam_set_data</span>(3)</span></a>
    以了解如何设置上下文对象。
    </p><div class="variablelist"><dl class="variablelist"><dt id="systemd.memory_max"><span class="term"><code class="varname">systemd.memory_max</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#systemd.memory_max">¶</a></dt><dd><p>设置单元的 <code class="varname">MemoryMax=</code> 选项</p></dd><dt id="systemd.tasks_max"><span class="term"><code class="varname">systemd.tasks_max</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#systemd.tasks_max">¶</a></dt><dd><p>设置单元的 <code class="varname">TasksMax=</code> 选项</p></dd><dt id="systemd.cpu_weight"><span class="term"><code class="varname">systemd.cpu_weight</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#systemd.cpu_weight">¶</a></dt><dd><p>设置单元的 <code class="varname">CPUWeight=</code> 选项</p></dd><dt id="systemd.io_weight"><span class="term"><code class="varname">systemd.io_weight</code></span><a class="headerlink" title="Permalink to this term" href="pam_systemd.html#systemd.io_weight">¶</a></dt><dd><p>设置单元的 <code class="varname">IOWeight=</code> 选项</p></dd></dl></div><p>其他 PAM 模块提供的数据示例：
      </p><pre class="programlisting">
pam_set_data(handle, "systemd.memory_max", (void *)"200M", cleanup);
pam_set_data(handle, "systemd.tasks_max",  (void *)"50",   cleanup);
pam_set_data(handle, "systemd.cpu_weight", (void *)"100",  cleanup);
pam_set_data(handle, "systemd.io_weight",  (void *)"340",  cleanup);
      </pre><p>
    </p></div><div class="refsect1"><a name="id-1.10"></a><h2 id="例子">例子<a class="headerlink" title="Permalink to this headline" href="pam_systemd.html#%E4%BE%8B%E5%AD%90">¶</a></h2><pre class="programlisting">#%PAM-1.0
auth       required     pam_unix.so
auth       required     pam_nologin.so
account    required     pam_unix.so
password   required     pam_unix.so
session    required     pam_unix.so
session    required     pam_loginuid.so
session    required     pam_systemd.so</pre></div><div class="refsect1"><a name="id-1.11"></a><h2 id="参见">参见<a class="headerlink" title="Permalink to this headline" href="pam_systemd.html#%E5%8F%82%E8%A7%81">¶</a></h2><p>
      <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>,
      <a href="systemd-logind.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-logind.service</span>(8)</span></a>,
      <a href="logind.conf.html#"><span class="citerefentry"><span class="refentrytitle">logind.conf</span>(5)</span></a>,
      <a href="loginctl.html#"><span class="citerefentry"><span class="refentrytitle">loginctl</span>(1)</span></a>,
      <a href="http://man7.org/linux/man-pages/man5/pam.conf.5.html"><span class="citerefentry"><span class="refentrytitle">pam.conf</span>(5)</span></a>,
      <a href="http://man7.org/linux/man-pages/man5/pam.d.5.html"><span class="citerefentry"><span class="refentrytitle">pam.d</span>(5)</span></a>,
      <a href="http://man7.org/linux/man-pages/man8/pam.8.html"><span class="citerefentry"><span class="refentrytitle">pam</span>(8)</span></a>,
      <a href="http://man7.org/linux/man-pages/man8/pam_loginuid.8.html"><span class="citerefentry"><span class="refentrytitle">pam_loginuid</span>(8)</span></a>,
      <a href="systemd.scope.html#"><span class="citerefentry"><span class="refentrytitle">systemd.scope</span>(5)</span></a>,
      <a href="systemd.slice.html#"><span class="citerefentry"><span class="refentrytitle">systemd.slice</span>(5)</span></a>,
      <a href="systemd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd.service</span>(5)</span></a>
    </p></div></div></body></html>
